import com.itheima.Cat;

import java.lang.reflect.Constructor;
import java.util.Arrays;
import java.util.stream.Collectors;

public class Task {
    public static void main(String[] args) throws NoSuchMethodException {
        testGetConstructors();
        testGetConstructorWithParams();
    }

    public static void testGetConstructors() {
        // 1、反射第一步：必须先得到这个类的Class对象
        Class<?> c = Cat.class;
        // 2、获取类的全部构造器
        Constructor<?>[] constructors /* TODO 获取类声明的全部构造器 */;
        // 3、遍历数组中的每个构造器对象
        for (Constructor<?> constructor : constructors) {
            System.out.printf("构造%s->参数个数：%d ==> ", constructor.getName(), constructor.getParameterCount());
            // 打印所有参数类型
            Class<?>[] parameterTypes = constructor.getParameterTypes();
            System.out.println("参数列表：" +
                    Arrays.stream(parameterTypes)
                            .map(Class::getName)
                            .collect(Collectors.joining(", "))
            );
        }
    }

    public static void testGetConstructorWithParams() throws NoSuchMethodException {
        // 1、反射第一步：必须先得到这个类的Class对象
        Class<?> c = Cat.class;
        // 2、获取类的某个构造器：无参数构造器
        Constructor<?> constructor1 /* TODO 获取无参数构造器 */;
        System.out.printf("构造%s->参数个数：%d%n", constructor1.getName(), constructor1.getParameterCount());

        // 3、获取有参数构造器 (String.class, int.class)
        Constructor<?> constructor2 /* TODO 获取有参构造器，参数为 String.class, int.class */;
        System.out.printf("构造%s->参数个数：%d%n", constructor2.getName(), constructor2.getParameterCount());
    }
}